import os
import tkinter as tk
from tkinter import messagebox
from tkinter import ttk

def get_txt_files(directory):
    """
    获取指定目录下的所有 .txt 文件
    """
    return [f for f in os.listdir(directory) if f.lower().endswith('.txt')]

def extract_numbers_from_file(file_path):
    """
    从 .txt 文件中提取所有的数字，并返回数字的列表
    """
    numbers = []
    try:
        with open(file_path, 'r') as file:
            # 读取文件内容并提取数字
            for line in file:
                numbers.extend([int(word) for word in line.split() if word.isdigit()])
    except Exception as e:
        print(f"无法读取文件 {file_path}: {e}")
    return numbers

def analyze_directory(directory):
    """
    统计指定目录下所有 .txt 文件中数字的出现情况
    """
    # 获取所有 txt 文件
    txt_files = get_txt_files(directory)
    
    # 字典用于存储数字出现的次数和对应的文件名
    number_stats = {}

    # 遍历每个 txt 文件，提取数字并统计
    for idx, txt_file in enumerate(txt_files):
        file_path = os.path.join(directory, txt_file)
        numbers = extract_numbers_from_file(file_path)

        for number in numbers:
            if number not in number_stats:
                number_stats[number] = {'count': 0, 'files': []}
            number_stats[number]['count'] += 1
            if len(number_stats[number]['files']) < 5:
                number_stats[number]['files'].append(txt_file)

        # 更新进度条
        progressbar['value'] = (idx + 1) / len(txt_files) * 100
        label_status.config(text=f"正在处理文件: {txt_file} ({idx + 1}/{len(txt_files)})")
        root.update_idletasks()  # 强制更新界面

    return number_stats

def display_results(number_stats):
    """
    在 GUI 中显示统计结果
    """
    # 清空显示区域
    result_text.delete(1.0, tk.END)

    for number, stats in sorted(number_stats.items()):
        result_text.insert(tk.END, f"数字 {number} 出现了 {stats['count']} 次:\n")
        result_text.insert(tk.END, f"相关的文件有：\n")
        for file in stats['files']:
            result_text.insert(tk.END, f"  - {file}\n")
        result_text.insert(tk.END, "\n")

def on_submit():
    """
    获取用户输入的路径并进行统计
    """
    directory = entry_directory.get().strip()

    if not directory:
        messagebox.showwarning("警告", "请输入目录路径！")
        return

    if not os.path.isdir(directory):
        messagebox.showwarning("警告", "请输入有效的目录路径！")
        return

    # 初始化进度条
    progressbar['value'] = 0
    label_status.config(text="正在开始...")

    # 获取并显示统计结果
    number_stats = analyze_directory(directory)
    display_results(number_stats)

# 创建主窗口
root = tk.Tk()
root.title("数字统计工具")

# 设置窗口大小
root.geometry("500x550")

# 显示提示文字
label_intro = tk.Label(root, text="请输入你要统计的目录路径，程序会统计该目录下所有txt文件中数字的出现情况，\n并列出每个数字的出现文件。")
label_intro.pack(pady=10)

label_path_support = tk.Label(root, text="支持的路径格式: \nC:\labelimg\download_img (Windows风格)\nC:\\\\labelimg\\\\download_img (Windows风格)\nC:/labelimg/download_img (Unix风格)")
label_path_support.pack(pady=10)

# 创建输入框
label_directory = tk.Label(root, text="目录路径 (绝对路径)：")
label_directory.pack(pady=5)

entry_directory = tk.Entry(root, width=50)
entry_directory.pack(pady=5)

# 创建按钮
button_submit = tk.Button(root, text="开始统计", command=on_submit)
button_submit.pack(pady=20)

# 创建文本框显示结果
result_text = tk.Text(root, width=60, height=15)
result_text.pack(pady=10)

# 创建进度条
progressbar = ttk.Progressbar(root, orient="horizontal", length=300, mode="determinate")
progressbar.pack(pady=10)

# 创建状态标签，用于显示当前进度
label_status = tk.Label(root, text="")
label_status.pack(pady=10)

# 启动主事件循环
root.mainloop()
